package com.copsoftware.procesos.investigacion.dao;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.util.Collection;

import org.hibernate.CacheMode;

import com.copsoftware.comun.beans.BeanPersona;
import com.copsoftware.db.DAOSession;
import com.copsoftware.entity.DenAcusadoInvestigacionImpl;
import com.copsoftware.entity.DenExpertoInvestigacionImpl;
import com.copsoftware.entity.DenInvestigacionImpl;
import com.copsoftware.entity.DenPersonaImpl;
import com.copsoftware.entity.DenTestigoInvestigacionImpl;
import com.copsoftware.hibernate.cfg.HibernateUtils;
import com.copsoftware.mantenimientos.persona.beans.PersonaCompletaFlt;
import com.copsoftware.utils.beans.BeanBuilder;
import com.copsoftware.utils.constants.CSConstants;
import com.copsoftware.utils.dao.WhereBuilder;


public class InvestigacionDAO extends DAOSession{
	
	public DenInvestigacionImpl buscarInvestigacion(Integer cInvestigacion)
	{
		StringBuffer hql = new StringBuffer();
		hql.append("from DenInvestigacionImpl where CInvestigacion=").append(cInvestigacion);
		return (DenInvestigacionImpl) getSession().createQuery(hql.toString()).uniqueResult();
	}
 
	public void guardarInvestigacion(DenInvestigacionImpl denInvestigacion) {
		getSession().saveOrUpdate(denInvestigacion);
		getSession().flush();
	}
	
	public void actualizarEstadoInvestigacion(Integer idInvestigacion,Integer idEstado) {
		StringBuffer sql = new StringBuffer();
		sql.append(" UPDATE DEN_INVESTIGACION SET C_ESTADO=").append(idEstado).append(" WHERE C_INVESTIGACION=").append(idInvestigacion);
		getSession().createSQLQuery(sql.toString()).executeUpdate();
//		getSession().flush();
	}
	
	public void guardarExpertos(DenExpertoInvestigacionImpl denInvestigacionExperto) {
		getSession().saveOrUpdate(denInvestigacionExperto);
//		getSession().flush();
	}
	


	public void actualizarInvestigacionDenuncia(Integer idInvestigacion,Integer idDenuncia) {
		StringBuffer sql = new StringBuffer();
		sql.append(" UPDATE DEN_DENUNCIA SET C_INVESTIGACION=").append(idInvestigacion).
		append(", C_ESTADO=").append(CSConstants.ESTADO_ASIGNADO).
		append(" WHERE C_DENUNCIA=").append(idDenuncia);
		getSession().createSQLQuery(sql.toString()).executeUpdate();
	} 
	
	/* ******* TESTIGOS ************* */
	public void guardarTestigosInvestigacion(DenTestigoInvestigacionImpl denInvestigacionTestigo) {
		getSession().saveOrUpdate(denInvestigacionTestigo);
		getSession().flush();
	}
	
	public DenTestigoInvestigacionImpl buscarTestigo(Integer cInvestigacion, Integer cTestigo)
	{
		StringBuffer hql = new StringBuffer();
		hql.append("from DenTestigoInvestigacionImpl where id.CInvestigacion=").append(cInvestigacion).
		append( " and id.CTestigo=").append(cTestigo);
		return (DenTestigoInvestigacionImpl) getSession().createQuery(hql.toString()).uniqueResult();
	}
	
	public Collection buscarTestigos(Integer cInvestigacion) throws Exception{
		
		StringBuffer hql = new StringBuffer();
		hql.append(" Select new map (t.CPersona as CPersona, t.XNombre as XNombre, t.XApellido as XApellido) ");
		hql.append(" From DenTestigoImpl t inner join t.denTestigoInvestigacions i ");
		hql.append(" Where i.id.CInvestigacion=").append(cInvestigacion);
		Collection  col =getSession().createQuery(hql.toString()).list();
		
		return BeanBuilder.procesarFila(col, BeanPersona.class); 
		
	}
	
	public Collection buscarPersonaSinInv(PersonaCompletaFlt personaCompletaFlt) {
		String tipoPersona = personaCompletaFlt.getTipoPersona();
		
		StringBuffer hql = new StringBuffer();
		hql.append(" select new map (t.CPersona as CPersona, t.XNombre as XNombre, t.XApellido as XApellido) ");
		hql.append(" from DenTestigoImpl t left join t.denTestigoInvestigacions i");
		hql.append(" where not exists(from DenTestigoInvestigacionImpl ti where ti = i) ");
		WhereBuilder where = new WhereBuilder(personaCompletaFlt);
		where.registerMatch("CPersona", "CPersona");
		where.registerMatch("XNombre", "XNombre");
		where.registerMatch("XApellido", "XApellido");

		
		if (DenPersonaImpl.TIPO_PERSONA_DENUNCIANTE.compareTo(Integer.valueOf(tipoPersona))==0) {
			where.registerMatch("CSeccion", "t.CSeccion");
			where.registerMatch("CCargo", "t.CCargo ");
		}

		where.execute();
		if (where.getParameters() != null)
			hql.append(" and ");
		hql.append(where.getSql());
		System.out.println(hql.toString());
		Collection  col =getSession().createQuery(hql.toString()).list();
		try {
			return BeanBuilder.procesarFila(col, BeanPersona.class); 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;

	}
	
	
	/* ********** ********** ****************/
	/* ********** ACUSADOS ****************/
	public void guardarAcusadosInvestigacion(DenAcusadoInvestigacionImpl denInvestigacionAcusado) {
		
		getSession().saveOrUpdate(denInvestigacionAcusado);
		getSession().flush();

	}
	

	public DenAcusadoInvestigacionImpl buscarAcusado(Integer cInvestigacion, Integer cAcusado)
	{
		StringBuffer hql = new StringBuffer();
		hql.append("from DenAcusadoInvestigacionImpl where id.CInvestigacion=").append(cInvestigacion).
		append( " and id.CAcusado=").append(cAcusado);
	
		return (DenAcusadoInvestigacionImpl) getSession().createQuery(hql.toString()).uniqueResult();
	}
	
	public Collection buscarAcusados(Integer cInvestigacion) throws Exception{
		
		StringBuffer hql = new StringBuffer();
		hql.append(" Select new map (t.CPersona as CPersona, t.XNombre as XNombre, t.XApellido as XApellido) ");
		hql.append(" From DenAcusadoImpl t inner join t.denAcusadoInvestigacions i ");
		hql.append(" Where i.id.CInvestigacion=").append(cInvestigacion);
		Collection  col =getSession().createQuery(hql.toString()).list();
		
		return BeanBuilder.procesarFila(col, BeanPersona.class); 
		
	}
	
	public Collection buscarAcusadosSinInv(Integer cInvestigacion) throws Exception{
		
		StringBuffer hql = new StringBuffer();
		hql.append(" Select distinct new map (t.CPersona as CPersona, t.XNombre as XNombre, t.XApellido as XApellido) ");
		hql.append(" From DenAcusadoImpl t inner join t.denAcusadoInvestigacions i ");
	
		if (cInvestigacion != null)
			hql.append(" Where ti.id.CInvestigacion !=").append(cInvestigacion);
		Collection  col =getSession().createQuery(hql.toString()).list();
		
		return BeanBuilder.procesarFila(col, BeanPersona.class); 
		
	}
	
	public Collection buscarAcusadoSinInv(PersonaCompletaFlt personaCompletaFlt) {
		String tipoPersona = personaCompletaFlt.getTipoPersona();
		
		StringBuffer hql = new StringBuffer();
		hql.append(" select new map (t.CPersona as CPersona, t.XNombre as XNombre, t.XApellido as XApellido) ");
		hql.append(" from DenAcusadoImpl t left join t.denAcusadoInvestigacions i");
		hql.append(" where not exists(from DenAcusadoInvestigacionImpl ti where ti = i) ");
		WhereBuilder where = new WhereBuilder(personaCompletaFlt);
		where.registerMatch("CPersona", "t.CPersona");
		where.registerMatch("XNombre", "t.XNombre");
		where.registerMatch("XApellido", "t.XApellido");

		
		if (DenPersonaImpl.TIPO_PERSONA_ACUSADO.compareTo(Integer.valueOf(tipoPersona))==0) {
			where.registerMatch("CBanda", "t.denBanda.CBanda");
			where.registerMatch("XAlias", "t.XAlias");
		}

		where.execute();
		if (where.getParameters() != null)
			hql.append(" and ");
		hql.append(where.getSql());
		System.out.println(hql.toString());
		Collection  col =getSession().createQuery(hql.toString()).list();
		try {
			return BeanBuilder.procesarFila(col, BeanPersona.class); 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;

	}
	
	
	/* ********** ********** ****************/
	
	

}
